今天的空閒時間比較少,不過不論如何每天都會想辦法生出一篇有內容的文,也許比賽結束在找時間整理到blog完善。目前看來鐵人賽第一部份以比特幣論文為主的區塊鏈運作機制探討大概會寫半個月,不過第二部分應該可以講很快,進度上還是沒有問題的。
今天來看看比特幣論文中提到的網路運作流程:
New transactions are broadcast to all nodes.
將交易廣播到網路上,很好理解。原則上不需要每個節點都收到這筆交易、也不需要特別說一定要哪個區塊才被加入,只要最後有被最長的那個鏈收到就好。
目前比特幣一般都是交易被收錄進區塊後會在等後面6個區塊產生才當作交易成功,來確保交易確實有被加入網路上共識的鏈中。不過這也代表單就比特幣目前的實際運作情況下一筆交易大概要一小時後才能確定交易成功,請注意這只是比特幣實務運作上為了確保安全的機制,並非區塊鏈技術一定要很長的交易時間。
Each node collects new transactions into a block.
每個節點會把交易收錄到現在要新增的區塊中。乍看之下很像廢話,不過想想惡意攻擊者還真的能一直推送裡面沒有交易的合法區塊,但就如同前面幾天一直強調的,比特幣的正常運作是建立在網路中算力多的一方會希望比特幣正常運作。在該論文中,確實有給出誘因讓算力多者會成為維護比特幣正常運作的一方,因為這麼做的好處更大,我們這之後會詳細提到。
Each node works on finding a difficult proof-of-work for its block.
每個節點都去計算proof-of-work來加入下一個區塊進入鏈中,其實某個節點也可以不去算只負責紀錄啦。
When a node finds a proof-of-work, it broadcasts the block to all nodes.
計算到proof-of-work就廣播出去,之後會詳細提到proof-of-work其實就是所謂的挖礦,中獎了當然要領阿。
Nodes accept the block only if all transactions in it are valid and not already spent.
節點收到區塊之後除了驗證proof-of-work,也要確認裡面的每一筆交易合不合法。我們到目前為止的交易中都都假設只有一筆交易,並且交易必須只能往下交易一次,因為實際上比特幣中的錢如何產生(挖礦)的部份還沒說到。
Nodes express their acceptance of the block by working on creating the next block in the chain, using the hash of the accepted block as the previous hash.
真的沒什麼好說的,就loop1到6步驟。
如果把比特幣網路中的金錢從何而來的部份,也就是所謂的挖礦先放到後面討論,昨天的區塊鏈網路實作也能算合乎以上的步驟了,不過在我從參賽開始的學習到現在看來,這部份的議題其實相當複雜,畢竟扯到實務運作問題真的是多到說不清的。
最後會不會有節點在收到其他節點算完的區塊前自己也算好了呢?會!論文提到發生的話就拿目前最長的鏈來用,丟掉短的鏈,以此達成共識。
(圖源來自bitcoin developer-guide)
正常的運作情況會像上面第一張圖,偶爾會有來不及收到其他節點區塊的節點也算出
合法區塊,不過真的發生就選最長的丟掉短的。第二張圖就是發生51%攻擊時的情況,掌握多數算力者對區塊鏈網路有惡意,共識被打破。
今天既然談到了實務,就來講講虛擬貨幣出包的例子,請注意在這裡用的詞是虛擬貨幣出包,不是區塊鏈被破解,區塊鏈技術從中本聰2009年運行比特幣網路開始,沒有理論上的基本交易原則被破解過。
在目前大家看到的一些虛擬貨幣出包的新聞,我個人認為大致可以分成三種:
第一種是私鑰被看到,尤其是交易所被攻擊損失多少億的那種新聞,可是這完全不是區塊鏈的問題阿,對比傳統貨幣中錢包如果被人偷走去怪新台幣有問題顯然是不合理的。
第二種是打破共識,以比特幣論文為例就是惡意攻擊者掌握了大部份算力,但我們之後會提到在比特幣中給了掌握算力者維持運作的誘因,還記得我們在Day1提到中國礦池運算力總和目前是大於一半的,可是其實這些大礦池才是最守規矩維護比特幣運作的人,但這其實還是產生了一些問題,倡導去中心化的虛擬貨幣目前發展主要還是由這些掌握算力者和程式開發者主導。
第三種就是實務問題了,看到這裡的程式人們都深有所感吧,實務問題永遠也說不完阿。好在區塊鏈的紀錄是不可竄改的,這給了過於嚴重的實務問題一個緩衝的空間,實務上的出包往往與一、二種問題卦勾,讓我們以下面的例子來看。
來講個一次打破虛擬貨幣三個出包狀況的例子,使用了一種被稱為硬分叉(hard fork)的方法來解決,我個人認為這個情境搭配解法可以稱呼為開大絕。
這個例子又稱為DAO遭駭事件,因為還沒有討論到智能合約和以太幣相關的區塊鏈技術,這裡不太深入事件細節。
簡單來說DAO是一個利用以太幣做智能合約的組織。
->DAO組織的以太幣被駭了(第1種狀況,私鑰被看到)。
->開大絕使用硬分叉技術生出叫以太坊(Ethereum, ETH)的幣(第2種狀況,打破共識)。
->從原本的以太幣(Ethereum Classic,ETC)被盜走前的某個區塊開始之後生出另一條區塊,從而分出以太坊(第3種狀況,實務上出包,實務硬解)。
大家目前看到的以太幣基本上都是指分出來的以太坊(Ethereum, ETH),當然這也產生了上面提到的開發者某種程度上主導共識的問題。
另外如果上網搜尋該事件大部分的標題會是「DAO遭駭事件打破區塊鏈不可逆神話」,甚至第一篇文章是iThome的,我認為這蠻誤導的,iThome如果要標榜技術的話我覺得這有點不好。硬分叉本來就是虛擬貨幣在實務情況上無法達成共識會發生的一種情況,沒有什麼神話被打破,硬要說有東西跟打不打破有關也只有交易紀錄,但交易紀錄基本上只能被丟棄,無法竄改,一切都符合區塊鏈原理,這部份的解讀我認為這篇文寫的不錯可以參考。
硬分叉(hard fork)的概念其實很簡單,在某個區塊以後用新版協議的區塊才加進來,舊版的一些擁護者不願意支持新版本繼續使用舊版,從此以後的區塊鏈就被分成新、舊兩版啦,實務上大概就是在區塊裡面塞個版本號之類的東西,一般來說就是該區塊鏈的使用者無法達成共識產生分裂的時候會發生的情況,以上面的例子來說就是開大絕把幣被盜走後的區塊都丟掉。
硬分叉示意圖(圖源來自bitcoin developer-guide)
說不定哪天生不出文章可以讓報明牌鏈衍生一次硬分叉來演示,這樣就能在發聳動標題了。
《Bitcoin: A Peer-to-Peer Electronic Cash System》
https://bitcoin.org/bitcoin.pdf
bitcoin developer-guide
https://bitcoin.org/en/developer-guide
以太幣 DAO 事件打破區塊鏈不可逆神話,13 億人都驚呆了(一)
https://technews.tw/2017/09/29/ethereum-dao-part-1/